# -*- coding:utf-8 -*-
"""
@Author : 审心
@Time : 2023/3/28 10:07
文件相关工具类
"""

import os
import glob
import time
import zipfile
from typing import List, Optional


def clear_folder(folder_path: str, file_like_name: Optional[str] = None):
    """
    清空指定路径下的所有文件
    :param folder_path: 文件夹路径
    :param file_like_name: 忽略删除模糊匹配到的文件名称
    """
    # 获取指定路径下的所有文件
    files = os.listdir(folder_path)

    # 遍历所有文件，如果是文件则删除，如果是文件夹则递归调用该方法进行删除
    for file_name in files:
        # 拼接文件路径
        file_path = os.path.join(folder_path, file_name)
        if os.path.isfile(file_path):
            if file_name.endswith(".keep"):
                continue
            if file_like_name and file_like_name in file_name:
                continue
            # 如果是文件则删除
            os.remove(file_path)
        else:
            # 如果是文件夹则递归调用该方法进行删除
            clear_folder(file_path)
            # 删除空文件夹
            os.rmdir(file_path)


def get_project_root() -> str:
    """获取项目根目录"""
    current_dir = os.path.dirname(os.path.abspath(__file__))
    while not os.path.exists(os.path.join(current_dir, '.gitignore')):
        current_dir = os.path.dirname(current_dir)
    return current_dir


def find_file(folder_path: str, match: str, timeout: int = 10) -> List[str]:
    """
    根据名称模糊查找文件绝对路径
    :param folder_path: 文件夹路径
    :param match: 匹配的表达式
    :param timeout 超时时间 默认10秒
    :return: 匹配到的文件路径
    """
    matching_files = []
    for _ in range(-1, timeout):
        matching_files = glob.glob(os.path.join(folder_path, match))
        if len(matching_files) > 0:
            matching_files = sorted(matching_files, key=lambda x: os.path.getctime(x), reverse=True)
            break
        time.sleep(1)
    return matching_files


def count_files(folder_path):
    """
    获取指定文件夹下的文件数量

    :param folder_path: 文件夹路径
    :return: 文件数量
    """
    file_count = 0
    with os.scandir(folder_path) as entries:
        for entry in entries:
            if entry.is_file():
                file_count += 1
    return file_count


def read_file_contents(file_path: [str, List], encoding: str = 'utf-8') -> [str]:
    """
    读取指定路径的文件内容
    :param file_path: 单个或一个列表
    :param encoding: 文件编码
    :return: 文件内容列表
    """
    contents = []
    if isinstance(file_path, str):
        with open(file_path, 'r', encoding=encoding) as f:
            contents.append(f.read())
    elif isinstance(file_path, List):
        for file in file_path:
            with open(file, 'r', encoding=encoding) as f:
                contents.append(f.read())
    return contents


def zip_folder(folder_path, output_path) -> str:
    """
    压缩指定文件夹内的所有文件到一个 ZIP 文件中

    :param folder_path: 要压缩的文件夹路径
    :param output_path: 输出的 ZIP 文件路径
    :return 输出的 zip 文件路径
    Example:
        >>> zip_folder(".", "example.zip")
    """
    # 创建一个 ZipFile 对象
    with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zip_file:
        # 遍历文件夹内的所有文件
        for root, dirs, files in os.walk(folder_path):
            for file in files:
                # 构造文件的完整路径
                file_path = os.path.join(root, file)
                # 如果当前文件是输出的 ZIP 文件，则跳过不进行压缩
                if os.path.abspath(file_path) == os.path.abspath(output_path):
                    continue
                # 将文件添加到 ZIP 文件中
                zip_file.write(file_path, os.path.relpath(file_path, folder_path))
    return output_path


def get_all_files_in_folder(folder_path: str) -> List[str]:
    """
    获取指定文件夹下的所有文件的路径，并返回一个列表。

    Args:
        folder_path (str): 指定文件夹的路径。

    Returns:
        List[str]: 包含所有文件路径的列表。
    """
    files = []
    for dir_path, dir_names, filenames in os.walk(folder_path):
        for filename in filenames:
            files.append(os.path.join(dir_path, filename))
    return files


if __name__ == '__main__':
    result_path = get_project_root() + r"/taskTemplateExcel/gjc/competitorGoodKey/result"
    print(get_all_files_in_folder(result_path))
